return g_object_get_data (G_OBJECT (window), "gtk-menu-bar-list");
}
-static GList *
-get_viewable_menu_bars (GtkWindow *window)
+GList *
+_gtk_menu_bar_get_viewable_menu_bars (GtkWindow *window)
{
GList *menu_bars;
GList *viewable_menu_bars = NULL;
g_object_set_data (G_OBJECT (window), I_("gtk-menu-bar-list"), menubars);
}
-static gboolean
-window_key_press_handler (GtkWidget *widget,
- GdkEventKey *event,
- gpointer data)
-{
- gchar *accel = NULL;
- gboolean retval = FALSE;
-
- g_object_get (gtk_widget_get_settings (widget),
- "gtk-menu-bar-accel", &accel,
- NULL);
-
- if (accel && *accel)
- {
- guint keyval = 0;
- GdkModifierType mods = 0;
-
- gtk_accelerator_parse (accel, &keyval, &mods);
-
- if (keyval == 0)
- g_warning ("Failed to parse menu bar accelerator '%s'\n", accel);
-
- /* FIXME this is wrong, needs to be in the global accel resolution
- * thing, to properly consider i18n etc., but that probably requires
- * AccelGroup changes etc.
- */
- if (event->keyval == keyval &&
- ((event->state & gtk_accelerator_get_default_mod_mask ()) ==
- (mods & gtk_accelerator_get_default_mod_mask ())))
- {
- GList *tmp_menubars = get_viewable_menu_bars (GTK_WINDOW (widget));
- GList *menubars;
-
- menubars = _gtk_container_focus_sort (GTK_CONTAINER (widget), tmp_menubars,
- GTK_DIR_TAB_FORWARD, NULL);
- g_list_free (tmp_menubars);
-
- if (menubars)
- {
- GtkMenuShell *menu_shell = GTK_MENU_SHELL (menubars->data);
-
- _gtk_menu_shell_set_keyboard_mode (menu_shell, TRUE);
- gtk_menu_shell_select_first (menu_shell, FALSE);
-
- g_list_free (menubars);
-
- retval = TRUE;
- }
- }
- }
-
- g_free (accel);
-
- return retval;
-}
-
static void
add_to_window (GtkWindow *window,
GtkMenuBar *menubar)
{
GList *menubars = get_menu_bars (window);
- if (!menubars)
- {
- g_signal_connect (window,
- "key-press-event",
- G_CALLBACK (window_key_press_handler),
- NULL);
- }
-
set_menu_bars (window, g_list_prepend (menubars, menubar));
}
GList *menubars = get_menu_bars (window);
menubars = g_list_remove (menubars, menubar);
-
- if (!menubars)
- {
- g_signal_handlers_disconnect_by_func (window,
- window_key_press_handler,
- NULL);
- }
-
set_menu_bars (window, menubars);
}
if (gtk_widget_is_toplevel (toplevel))
{
- GList *tmp_menubars = get_viewable_menu_bars (GTK_WINDOW (toplevel));
+ GList *tmp_menubars = _gtk_menu_bar_get_viewable_menu_bars (GTK_WINDOW (toplevel));
GList *menubars;
GList *current;
#include "gtkmain.h"
#include "gtkmnemonichash.h"
#include "gtkmenubar.h"
+#include "gtkmenushellprivate.h"
#include "gtkicontheme.h"
#include "gtkmarshalers.h"
#include "gtkplug.h"
return result != 0;
}
+static gboolean
+gtk_window_activate_menubar (GtkWindow *window,
+ GdkEventKey *event)
+{
+ GtkWindowPrivate *priv = window->priv;
+ gchar *accel = NULL;
+ guint keyval = 0;
+ GdkModifierType mods = 0;
+
+ g_object_get (gtk_widget_get_settings (GTK_WIDGET (window)),
+ "gtk-menu-bar-accel", &accel,
+ NULL);
+
+ if (accel == NULL || *accel == 0)
+ return FALSE;
+
+ gtk_accelerator_parse (accel, &keyval, &mods);
+ g_free (accel);
+
+ if (keyval == 0)
+ {
+ g_warning ("Failed to parse menu bar accelerator '%s'\n", accel);
+ return FALSE;
+ }
+
+ /* FIXME this is wrong, needs to be in the global accel resolution
+ * thing, to properly consider i18n etc., but that probably requires
+ * AccelGroup changes etc.
+ */
+ if (event->keyval == keyval &&
+ ((event->state & gtk_accelerator_get_default_mod_mask ()) ==
+ (mods & gtk_accelerator_get_default_mod_mask ())))
+ {
+ GList *tmp_menubars;
+ GList *menubars;
+ GtkMenuShell *menu_shell;
+
+ if (priv->title_box != NULL &&
+ !gtk_widget_is_ancestor (gtk_window_get_focus (window), priv->title_box) &&
+ gtk_widget_child_focus (priv->title_box, GTK_DIR_TAB_FORWARD))
+ return TRUE;
+
+ tmp_menubars = _gtk_menu_bar_get_viewable_menu_bars (window);
+ if (tmp_menubars == NULL)
+ return FALSE;
+
+ menubars = _gtk_container_focus_sort (GTK_CONTAINER (window), tmp_menubars,
+ GTK_DIR_TAB_FORWARD, NULL);
+ g_list_free (tmp_menubars);
+
+ if (menubars == NULL)
+ return FALSE;
+
+ menu_shell = GTK_MENU_SHELL (menubars->data);
+
+ _gtk_menu_shell_set_keyboard_mode (menu_shell, TRUE);
+ gtk_menu_shell_select_first (menu_shell, FALSE);
+
+ g_list_free (menubars);
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
static void
gtk_window_mnemonic_hash_foreach (guint keyval,
GSList *targets,
}
}
- return FALSE;
+ return gtk_window_activate_menubar (window, event);
}
static void